#include "ManejoDeBloques.h"


ManejoDeBloques::ManejoDeBloques(int tam_bloque, const string& ruta_arch_bloques){
	this->tam_bloque = tam_bloque;
	this->ruta_arch_bloques = ruta_arch_bloques;
}

ManejoDeBloques::ManejoDeBloques(int tam_bloque){
	this->tam_bloque = tam_bloque;
}

void ManejoDeBloques::set_tam_bloque(int tam_bloque) {
	this->tam_bloque = tam_bloque;
}

void ManejoDeBloques::set_ruta_arch_bloques(const string& ruta_arch_bloques) {
	this->ruta_arch_bloques = ruta_arch_bloques;
}


void ManejoDeBloques::crear_arch_vacio() const {
	fstream arch;
	arch.open(this->ruta_arch_bloques.c_str(), fstream::out);
	arch.close();
}

int ManejoDeBloques::get_tam_arch_bloques() const {
	fstream arch;
	int tam;

	arch.open(this->ruta_arch_bloques.c_str(), fstream::in);
	if (!arch.is_open()){
		arch.open(this->ruta_arch_bloques.c_str(), fstream::out);
		arch.close();
		arch.open(this->ruta_arch_bloques.c_str(), fstream::in);
	}
	arch.seekg(0, fstream::end);
	tam = arch.tellg();
	arch.close();

	return tam;
}

void ManejoDeBloques::recuperar_bloque(char* buffer, int pos_arch_bloques) {
	fstream arch;

	arch.open(this->ruta_arch_bloques.c_str(), fstream::in);
	arch.seekg(pos_arch_bloques * this->tam_bloque, ios::cur);
	arch.read(buffer, this->tam_bloque);
	arch.close();
}

void ManejoDeBloques::recuperar_bloque_arbol(int nro_bloque, char* Buffer){
	fstream ff;
	ff.open(this->ruta_arch_bloques.c_str(), fstream::in);
	if (!ff.is_open()){
		ff.open(this->ruta_arch_bloques.c_str(), fstream::out);
		ff.close();
		ff.open(this->ruta_arch_bloques.c_str(), fstream::in);
	}

		int offset_bloque = nro_bloque * this->tam_bloque;
		ff.seekg(offset_bloque, ios::cur);
		ff.read(Buffer, this->tam_bloque);
		ff.close();

}

int ManejoDeBloques::get_num_prox_bloque(){
	fstream arch;
	int pos_insercion;

	arch.open(this->ruta_arch_bloques.c_str(), fstream::out | fstream::in);

	arch.seekg(0, fstream::end);
	pos_insercion = arch.tellg() / this->tam_bloque;

	arch.close();
	return pos_insercion;
}

int ManejoDeBloques::guardar_bloque(char* buffer) {
	fstream arch;
	int pos_insercion;

	arch.open(this->ruta_arch_bloques.c_str(), fstream::out | fstream::in);

	arch.seekg(0, fstream::end);
	pos_insercion = arch.tellg() / this->tam_bloque;

	arch.write(buffer, this->tam_bloque);
	arch.close();

	return pos_insercion;
}

void ManejoDeBloques::guardar_bloque(char* buffer, int pos_insercion) {
	fstream arch;

	arch.open(this->ruta_arch_bloques.c_str(), fstream::out | fstream::in);

	arch.seekg(pos_insercion * this->tam_bloque, ios::cur);

	arch.write(buffer, this->tam_bloque);
	arch.close();
}

void ManejoDeBloques::guardar_bloque_arbol(char* buffer, int nro_bloque){
	fstream ff;
	ff.open(this->ruta_arch_bloques.c_str(), fstream::in | fstream::out);
	if (!ff.is_open()){
		ff.open(this->ruta_arch_bloques.c_str(), fstream::out);
		ff.close();
		ff.open(this->ruta_arch_bloques.c_str(), fstream::in | fstream::out);
	}
		int offset_bloque = nro_bloque * this->tam_bloque;
		ff.seekg(offset_bloque, ios::cur);
		ff.write(buffer, this->tam_bloque);
		ff.flush();
		ff.close();
}



